﻿using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace Quarto
{
    public class Grille : Microsoft.Xna.Framework.Game
    {
        private Case[,] tab_case;
        private Sprite sprite;

        public Case[,] Tab_case
        {
            get { return tab_case; }
            set { tab_case = value; }
        }
        public Sprite Sprite
        {
            get { return sprite; }
            set { sprite = value; }
        }

        public Grille(ContentManager Content)
        {
            this.sprite = new Sprite(Content.Load<Texture2D>("Grille"), 240, 25);
            this.tab_case = new Case[4, 4];
            for (int i = 0; i < 4; i++)
            {
                for (int j = 0; j < 4; j++)
                {
                    this.tab_case[i, j] = new Case();
                }
            }
        }

        public Case get_case_grille(int i, int j)
        {
            return this.tab_case[i,j];
        }
        public bool poser_piece_grille(int i, int j, int indice, Liste_Piece liste_piece)
        {
            if (this.tab_case[i, j].Rempli == false)
            {
                Piece p = liste_piece.Liste_piece_depart[indice];
                p.Pose = true;
                this.tab_case[i, j].Rempli = true;
                this.tab_case[i, j].Piece_case = p;
                liste_piece.Liste_piece_posee[indice] = true;
                return true;
            }
            else
                return false;
        }
        public bool test_grille_vide()
        {
            for(int i = 0; i<4; i++)
            {
                for (int j = 0; j < 4; j++)
                {
                    if (this.Tab_case[i, j].Rempli == true)
                        return false;
                }
            }
            return true;
        }
        public void vider_case_grille(int i, int j)
        {
            this.tab_case[i, j].Rempli = false;
            this.tab_case[i, j].Piece_case = null;
        }
        public bool test_fin(Liste_Motif liste_motif)
        {
            /*Test des lignes et colonnes*/
            if (Motif.test_ligne(this))
            {
                return true;
            }

            /*Test des matrices 3x2*/
            Case[,] matrice = new Case[3, 2];
            Case[,] matrice_bis = new Case[3, 2];
            for (int i = 0; i < 2; i++) /*Se renseigner sur Array.Copy()*/
            {
                for (int j = 0; j < 3; j++)
                {
                    matrice[0, 0] = this.Tab_case[0 + i, 0 + j];
                    matrice[0, 1] = this.Tab_case[0 + i, 1 + j];
                    matrice[1, 0] = this.Tab_case[1 + i, 0 + j];
                    matrice[1, 1] = this.Tab_case[1 + i, 1 + j];
                    matrice[2, 0] = this.Tab_case[2 + i, 0 + j];
                    matrice[2, 1] = this.Tab_case[2 + i, 1 + j];

                    if (liste_motif.test_motif(matrice))
                        return true;
                    else
                    {
                        /*Test de la rotation de la pièce*/
                        matrice_bis[0, 0] = matrice[2, 1];
                        matrice_bis[0, 1] = matrice[2, 0];
                        matrice_bis[1, 0] = matrice[1, 1];
                        matrice_bis[1, 1] = matrice[1, 0];
                        matrice_bis[2, 0] = matrice[0, 1];
                        matrice_bis[2, 1] = matrice[0, 0];
                        if (liste_motif.test_motif(matrice_bis))
                            return true;
                    }
                }
            }
            /*Test des matrices 2x3*/
            Case[,] matrice2 = new Case[3, 2];
            Case[,] matrice_bis2 = new Case[3, 2];
            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 2; j++)
                {
                    matrice2[0, 0] = this.Tab_case[1 + i, 0 + j];
                    matrice2[0, 1] = this.Tab_case[0 + i, 0 + j];
                    matrice2[1, 0] = this.Tab_case[1 + i, 1 + j];
                    matrice2[1, 1] = this.Tab_case[0 + i, 1 + j];
                    matrice2[2, 0] = this.Tab_case[1 + i, 2 + j];
                    matrice2[2, 1] = this.Tab_case[0 + i, 2 + j];

                    if (liste_motif.test_motif(matrice2))
                        return true;
                    else
                    {
                        /*Test de la rotation de la pièce*/
                        matrice_bis2[0, 0] = matrice2[2, 1];
                        matrice_bis2[0, 1] = matrice2[2, 0];
                        matrice_bis2[1, 0] = matrice2[1, 1];
                        matrice_bis2[1, 1] = matrice2[1, 0];
                        matrice_bis2[2, 0] = matrice2[0, 1];
                        matrice_bis2[2, 1] = matrice2[0, 0];
                        if (liste_motif.test_motif(matrice_bis2))
                            return true;
                    }
                }
            }
            return false;
        }

        public void Draw(GameTime gameTime, SpriteBatch spriteBatch, Vector2 position)
        {
           sprite.Draw(spriteBatch, 500);
            for (int i = 0; i < 4; i++)
            {
                for (int j = 0; j < 4; j++)
                {
                    if (this.tab_case[i, j].Rempli)
                    {
                       this.tab_case[i, j].Piece_case.Sprite.Dimentions.X = 240 + i * Jeu.TAILLE_PIECE_JEU;
                       this.tab_case[i, j].Piece_case.Sprite.Dimentions.Y = 25 + j * Jeu.TAILLE_PIECE_JEU;
                       this.tab_case[i, j].Piece_case.Sprite.Dimentions.Width = Jeu.TAILLE_PIECE_JEU;
                       this.tab_case[i, j].Piece_case.Sprite.Dimentions.Height = Jeu.TAILLE_PIECE_JEU;
                       this.tab_case[i, j].Piece_case.Draw(gameTime, spriteBatch);
                    }
                }
            }
            base.Draw(gameTime);
        }
    }
}
